package Java7_Concurrency_Cookbook.thread_synchronized_helper.cyclic_barrier;

import java.util.concurrent.CyclicBarrier;

/**
 * 将矩阵分成 5 个子集, 并且每个子集使用线程进行查找. 这些线程查找类是 Searcher 对象.
 * 使用 CyclicBarrier 对象同步五个线程, 执行 Grouper 查找任务处理结果, 并且计算最终的结果.
 *
 * CyclicBarrier 类内部有一个计数器, 可以控制指定书目的几个线程必须到达集合点.
 * 每一个线程到达集合点后就会调用 await() 方法通知 CyclicBarrier 对象,
 * CyclicBarrier 对象会让这个线程休眠知道所有其他线程都到达集合点.
 *
 * 本示例中, 一个 Searcher 搜索线程完成搜索后, 会等待其它 Searcher 线程搜索完成,
 * 所有 Searcher 线程都搜索完成后, Grouper 线程会启动处理搜索结果
 */
public class Main {
    public static void main(String[] args) {
        final int ROWS = 10000;
        final int NUMBERS = 10000;
        final int SEARCH = 5;
        final int PARTICIPANTS = 5;
        final int LINES_PARTICIPANT = 2000;

        MatrixMock mock = new MatrixMock(ROWS, NUMBERS, SEARCH);
        Results results = new Results(ROWS);
        Grouper grouper = new Grouper(results);
        CyclicBarrier barrier = new CyclicBarrier(PARTICIPANTS, grouper);
        Searcher[] searchers = new Searcher[PARTICIPANTS];
        for (int i = 0; i < PARTICIPANTS; i++) {
            searchers[i] = new Searcher(i * LINES_PARTICIPANT,
                    (i * LINES_PARTICIPANT) + LINES_PARTICIPANT,
                    mock, results, 5, barrier);
            Thread thread = new Thread(searchers[i]);
            thread.start();
        }
        System.out.println("Main : The main thread has finished");
    }
}
